<?php
	/**
	* 图片处理类
	* 完成图片的水印添加与缩略图处理
	* @author houdunwang.com
	*/
	class Image{
		//////////水印配置
		private $waterOn;//水印开关
		private $waterImg;//水印图片
		private $qua;//JPEG图片的压缩比
		private $waterPos;//水印位置
		private $waterPct;//水印透明度
		private $waterText;//文字内容
		private $waterTextSize;//文字大小
		private $waterTextColor;//文字颜色
		private $waterTextFont;//字体
		//////////////缩略图配置项
		private $thumbWidth;//缩略图宽度
		private $thumbHeight;//缩略图高度
		private $thumbEndFix;//缩略图后缀
		private $thumbType;//缩略图处理方式

		//构造函数
		public function __construct(){
			//水印配置项
			$this->waterOn = C("WATER_ON");
			$this->waterImg = C("WATER_IMG");
			$this->waterPos = C("WATER_POS");
			$this->waterPct = C("WATER_PCT");
			$this->waterText = C("WATER_TEXT");
			$this->waterTextSize = C("WATER_TEXT_SIZE");
			$this->waterTextColor = C("WATER_TEXT_COLOR");
			$this->waterTextFont =C("WATER_FONT");
			$this->qua = C("WATER_QUA");
			//缩略图配置项
			$this->thumbWidth = C("THUMB_WIDTH");
			$this->thumbHeight = C("THUMB_HEIGHT");
			$this->thumbEndFix = C("THUMB_ENDFIX");
			$this->thumbType = C("THUMB_TYPE");
		}
		//验证文件是否为图片 并且验证GD库是否存在
		private function check($img){
			return is_file($img) && getimagesize($img) && extension_loaded("gd");
		}
		/**
		* 缩略图处理
		* @param string $img 				要处理的原图片
		* @param string $outFile 			储存的图片
		* @param string $thumbType 		哪种方式进行缩略处理
		* @param string $thumbWidth 	缩略图宽度
		* @param string $thumbHeight 	缩略图高度
		*/
		public function thumb($img,$outFile='',$thumbWidth='',$thumbHeight='',$thumbType=''){
			if(!$this->check($img)){
				return false;
			}
			$thumbType = $thumbType?$thumbType:$this->thumbType;//缩略图处理方式
			$thumbWidth = $thumbWidth?$thumbWidth:$this->thumbWidth;//缩略图处理方式
			$thumbHeight = $thumbHeight?$thumbHeight:$this->thumbHeight;//缩略图处理方式
			//获得原图的信息
			$imgInfo  =getimagesize($img);
			$imgWidth = $imgInfo[0];//原图宽度
			$imgHeight = $imgInfo[1];//原图宽度
			$imgType = image_type_to_extension($imgInfo[2]);//获得图片类型.jpeg  
			//根据不同的缩略方式获得尺寸 （原图和缩略图相应的尺寸）
			$thumb_size =$this->thumbSize($imgWidth,$imgHeight,$thumbWidth,$thumbHeight,$thumbType);
			//创建原图资源
			$func = "imagecreatefrom".substr($imgType,1);//变量函数
			$resImg = $func($img);//创建资源
			if($imgType=='.gif'){
				$res_thumb = imagecreate($thumb_size[2], $thumb_size[3]);
			}else{
				$res_thumb = imagecreatetruecolor($thumb_size[2], $thumb_size[3]);
			}
			imagecopyresized($res_thumb, $resImg, 0,0, 0, 0, $thumb_size[2], $thumb_size[3], 
				$thumb_size[0], $thumb_size[1]);
			$fileInfo = pathinfo($img);//文件信息
			$outFile = $outFile?$outFile:$fileInfo['filename'].$this->thumbEndFix.'.'.$fileInfo['extension'];
			$outFile= $fileInfo['dirname'].'/'.$outFile;//加上目录
			$func = "image".substr($imgType,1);//变量函数
			$func($res_thumb,$outFile);
			return $outFile;
		}
		//根据原图与缩略图尺寸结合不同的缩略方式，得到原图与缩略图计算后的尺寸
		private function thumbSize($imgWidth,$imgHeight,$thumbWidth,$thumbHeight,$thumbType){
			//缩略图尺寸
			$w = $thumbWidth;//缩略图宽度
			$h  = $thumbHeight;//缩略图高度
			//图片尺寸 
			$img_w = $imgWidth;
			$img_h = $imgHeight;
			switch($thumbType){
				case 1://宽度固定  高度自增
					//800  600 原图
					//200  200     3
					$h = $w/$imgWidth*$imgHeight;
					break;
				case 2://高度固定  宽度自增
					$w = $h/$imgHeight*$imgWidth;
					break;
				case 3://缩略图尺寸不变，对原图进行裁切
					if($imgHeight/$thumbHeight >$imgWidth/$thumbWidth){
						$img_h = $imgWidth/$thumbWidth*$thumbHeight;
					}else{
						$img_w = $imgHeight/$thumbHeight*$thumbWidth;
					}
				
			}
			return array($img_w,$img_h,$w,$h);
		}


		/**
		* 图片水印处理
		* @param string $img 		要处理的图片
		* @param string $outImg 	加完水印后存储的图片文件名
		* @param int $pos 			中水印的位置
		* @param int $waterImg 	水印的图片
		* @param int $pct 			水印的透明度
		* @param int $text 			水印的文字内容
		*/
		public function water($img,$outImg=null,$pos="",$waterImg="",$pct="",$text="",$textColor=''){
			//验证文件是否为图片 并且验证GD库是否存在
			if(!$this->check($img)){
				return false;
			}
			//水印图片
			$waterImg= $waterImg?$waterImg:$this->waterImg;
			//验证水印图片是否合法
			$waterImgOn = $this->check($waterImg);
			//储存的图片文件名
			$outImg = $outImg?$outImg:$img;
			//水印位置
			$pos = $pos?$pos:$this->waterPos;
			//水印文字
			$text = $text?$text:$this->waterText;
			//水印文字颜色 
			$textColor = $textColor?$textColor:$this->waterTextColor;
			//水印图片透明度
			$pct  = $pct?$pct:$this->waterPct;
			//获得原图尺寸
			$imgInfo = getimagesize($img);//原图信息
			$imgWidth = $imgInfo[0];//原图宽度
			$imgHeight = $imgInfo[1];//原图高度
			//创建原图的图像资源
			switch($imgInfo[2]){
					case 1:
						$resImg = imagecreatefromgif($img);
						break;
					case 2:
						$resImg = imagecreatefromjpeg($img);
						break;
					case 3:
						$resImg = imagecreatefrompng($img);
						break;
				}
			//用图片做水印
			if($waterImgOn){
				$waterInfo = getimagesize($waterImg);//获得水印图片信息
				$waterWidth= $waterInfo[0];//水印图的宽度
				$waterHeight= $waterInfo[1];//水印图的高度
				// 1 gif  2 jpeg 3 png
				//不同的图片使用不同的函数创建
				$w_img=null;//水印图片
				switch($waterInfo[2]){
					case 1:
						$w_img = imagecreatefromgif($waterImg);
						break;
					case 2:
						$w_img = imagecreatefromjpeg($waterImg);
						break;
					case 3:
						$w_img = imagecreatefrompng($waterImg);
						break;
				}
			}else{//当水印图片失效时，加文字水印
				//没有水印文字或者水印文字颜色设置错误
				if(empty($text) || strlen($textColor)!=7){
					return false;
				}
				$textInfo = imagettfbbox($this->waterTextSize, 0,$this->waterTextFont, $text);//获得文字水印盒子信息
				$waterWidth = $textInfo[2]-$textInfo[6];//文字盒子宽度
				$waterHeight = $textInfo[3]-$textInfo[7];//文字盒子高度
			}
			//计算水印放置的位置
			$x =$y=20;//默认水印的位置
			switch($pos){
				case 1:
					break;
				case 2:
					$x = ($imgWidth-$waterWidth)/2;
					break;
				case 3:
					$x = $imgWidth-$waterWidth-10;
					break;
				case 4:
					$y = ($imgHeight-$waterHeight)/2;
					break;
				case 5:
					$x = ($imgWidth-$waterWidth)/2;
					$y = ($imgHeight-$waterHeight)/2;
					break;
				case 6:
					$x = $imgWidth-$waterWidth-10;
					$y = ($imgHeight-$waterHeight)/2;
					break;
				case 7:
					$y = $imgHeight-$waterHeight-10;
					break;
				case 8:
					$x = ($imgWidth-$waterWidth)/2;
					$y = $imgHeight-$waterHeight-10;
					break;
				case 9:
					$x = $imgWidth-$waterWidth-10;
					$y = $imgHeight-$waterHeight-10;
					break;
				default://随机加水印
					$x = mt_rand(20,$imgWidth-$waterWidth);
					$y=  mt_rand(20,$imgHeight-$waterWidth);
			}
			if($waterImgOn){//当水印图有效时，以图片形式加水印
				if($waterInfo[2]==3){//为PNG图时
					imagecopy($resImg, $w_img, $x, $y, 0, 0, $waterWidth, $waterHeight);
				}else{
					imagecopymerge($resImg, $w_img, $x, $y, 0, 0, $waterWidth, $waterHeight,$pct);
				}
			}else{//文字水印
				#333333
				$red = hexdec(substr($this->waterTextColor,1,2));
				$green = hexdec(substr($this->waterTextColor,3,2));
				$blue = hexdec(substr($this->waterTextColor,5,2));
				$color = imagecolorallocate($resImg, $red, $green, $blue);
				imagettftext($resImg, $this->waterTextSize, 0, $x, $y, $color, $this->waterTextFont, $text);
			}
			//imagegif   imagejpeg   imagepng
			switch($imgInfo[2]){
				case 1:
					imagegif($resImg,$outImg);
					break;
				case 2:
					imagejpeg($resImg,$outImg,$this->qua);
					break;
				case 3:
					imagepng($resImg,$outImg);
					break;
			}
			//垃圾回收
			if(isset($resImg))
				imagedestroy($resImg);
			if(isset($w_img))
				imagedestroy($w_img);
			return true;
		}
	}
?>